home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / drdobbs / ddjcompr / hstest / src / unpack.asm < prev   
Assembly Source File  |  1991-04-13  |  2KB  |  112 lines

  1. ;
  2. ; UNPACK.ASM
  3. ;  hoch optimiertes unpackc()
  4. ;  funktional identisch zu unpack()c, aber doppelt so schnell
  5. ;
  6. ;
  7.     TITLE   unpack.c
  8.     NAME    unpack
  9.  
  10.     .286
  11.  
  12. _TEXT    SEGMENT  WORD PUBLIC 'CODE'
  13. _TEXT    ENDS
  14.  
  15.     ASSUME CS: _TEXT
  16.     ASSUME DS: NOTHING
  17.  
  18. _TEXT      SEGMENT
  19.     PUBLIC    _unpack
  20. _unpack        PROC FAR
  21.     enter    WORD PTR 22,0
  22.     push    di
  23.     push    si
  24.     push    ds
  25.  
  26. ;    outbuffer = 4
  27. ;    pbuffer = 8
  28. ;    register di = packlen
  29. ;   packlen = 10
  30. ;    register ds:si = pbuffer
  31. ;    register packmask = dl
  32. ;   register uloop    = dh
  33. ;    length = temp cx
  34. ;    index  = temp ax
  35. ;    sbuffer = -14
  36. ;    s = -6
  37.  
  38.     les    di,DWORD PTR [bp+6]  ; es:di -> destination
  39.     lds si,DWORD PTR [bp+10] ; ds:si -> source 
  40.     mov bx,si
  41.     add    bx,word ptr [bp+14]      ; end = si+packlen
  42.  
  43.     mov    dh,1
  44.     jmp    decode_next_group
  45.  
  46. copy_compressed:
  47.     lodsw                    ;     mov    ax,WORD PTR  [si++] ; pbuffer++
  48.     mov    cx,ax                ;index
  49.     and    ah,15
  50.  
  51.     shr    cx,12
  52.     add    cx,3
  53.  
  54.     cmp    cx,18                ; if (length == MAXLENGTH+2)
  55.     jne    @F
  56.  
  57.     mov    cl,BYTE PTR  [si]    ;     length = *pbuffer++
  58.     sub    ch,ch                ;
  59.     inc si                    ;
  60. @@:
  61.     push    si                ; memcpy(es:di,ds:si,cx)
  62.     push    ds                ; outbuffer += cx
  63.  
  64.     mov    si,di                ;outbuffer
  65.     sub    si,ax                ; index
  66.     mov ax,es
  67.     mov ds,ax
  68.  
  69.     rep    movsb                ; !!! not wordwise !!!
  70.     pop    ds                    ; offset -1 possible
  71.     pop si
  72.  
  73.                             ; done
  74.                             ; next Lines are duplicate to save jumps
  75.     cmp    si,bx                ; word ptr [bp+12]    ; packend
  76.     jnb    terminate            ; 
  77.  
  78.     dec    dh                    ; uloop
  79.     je    fetch_new_mask
  80.  
  81. test_next_group:
  82.     shl dl,1                ; packmask
  83.     jc    copy_compressed        ; if highest bit was set it was compressed
  84.  
  85.     movsb                    ; *outbuffer++ = *pbuffer++
  86.  
  87. decode_next_group:
  88.     cmp    si,bx                ; if (pbuffer >= packend)
  89.     jnb    terminate            ;     return;
  90.  
  91.     dec    dh                    ; if (--uloop == 0)
  92.     jne    test_next_group        ;     {
  93.  
  94. fetch_new_mask:
  95.     mov    dl,BYTE PTR [si]    ;    packmask = *pbuffer++
  96.     inc    si                    ;
  97.     mov    dh,8                ;     uloop   = 8
  98.     jmp short test_next_group    ;    }
  99.  
  100. terminate:
  101.     mov    ax,di                ;outbuffer
  102.     sub    ax,WORD PTR [bp+6]    ;dbuffer
  103.     pop ds
  104.     pop    si
  105.     pop    di
  106.     leave    
  107.     ret    
  108.  
  109. _unpack ENDP
  110. _TEXT    ENDS
  111. END
  112.